package com.skyline.spot.dao;

import java.util.List;

import com.skyline.base.type.Activity;
import com.skyline.base.type.SpotType;
import com.skyline.common.bean.Page;
import com.skyline.spot.model.Spot;

public interface SpotDao {

	
	/**
	 * 根据景点Id查找景点
	 * 
	 * @param spotId
	 *            景点ID
	 * @param activity           
	 * @return 景点对象
	 */
	public Spot querySpotById(Long spotId,Activity activity);
	
	/**
	 * 根据name查找景点
	 * @param name
	 * @return
	 */
	public List<Spot> querySpotsByName(String name,SpotType type,Activity activity);
	
	/**
	 * 查找所有景点
	 * @param type
	 * 			  spot类型 ,null 为全部
	 * @param page
	 *            每页页数，null为全部
	 * @param activity
	 *            查找对象的种类，normal,delete ,null为全部
	 * @return
	 */
	public List<Spot> querySpotsAll(SpotType type,Page page, Activity activity);

	/**
	 * 根据所在地编码和spot类型查找，根据siteId可以分别实现以国家分，省份分，城市分的查找
	 * @param siteId
	 * @param subLen 字串长度
	 * @param type null 为所有
	 * @param page null 为所有
	 * @param activity null 为所有
	 * @return
	 */
	public List<Spot> querySpotsBySiteIdAndType(String siteId, int subLen,SpotType type,
			Page page, Activity activity);
	
	/**
	 * 根据所在地编码和spot类型查找，根据siteId可以分别实现以国家分，省份分，城市分的查找
	 * @param siteId
	 * @param type null 为所有
	 * @param page null 为所有
	 * @param activity null 为所有
	 * @return
	 */
	public List<Spot> querySpotsByConntryAndType(String countryName, SpotType type,
			Page page, Activity activity);
	/**
	 * 根据所在地编码和spot类型查找，根据siteId可以分别实现以国家分，省份分，城市分的查找
	 * @param siteId
	 * @param type null 为所有
	 * @param page null 为所有
	 * @param activity null 为所有
	 * @return
	 */
	public List<Spot> querySpotsByProvinceAndType(String provinceName, SpotType type,
			Page page, Activity activity);
	/**
	 * 根据所在地编码和spot类型查找，根据siteId可以分别实现以国家分，省份分，城市分的查找
	 * @param siteId
	 * @param type null 为所有
	 * @param page null 为所有
	 * @param activity null 为所有
	 * @return
	 */
	public List<Spot> querySpotsByCityAndType(String cityName, SpotType type,
			Page page, Activity activity);


	/**
	 * 根据名词近似查找 初期考虑用like，新方法待实现
	 * @param likeName
	 * @param type null 为所有
	 * @param page null 为所有
	 * @param activity  null 为所有
	 * @return
	 */
	public List<Spot> querySpotByLikeName(String likeName,SpotType type,Page page,
			Activity activity);
	
	/**
	 * 更新的对象点的评分
	 * 
	 * @param spotId
	 * @param star
	 * @return
	 */
	public Spot updateSpotStar(Long spotId, Integer star);
	/**
	 * 更新对象点的访问量
	 * @param spotId
	 * @return
	 */
	public Spot updateSpotVistNum(Long spotId);

	// TODO
	/*
	 * 创建人
	 */
	/**
	 * 添加景点函数
	 * 
	 * @param name
	 *            景点名称
	 * @param portrait
	 *            头像
	 * @param type
	 *            类型 VIEWPOINT,RESTAURANT,OTHER 参见SpotType
	 * @param creatorId
	 *            创建者ID
	 * @param creatorNickName
	 *            创建者昵称
	 * @param creatorPortrait
	 *            创建者头像
	 * @param creatorEmail
	 *            创建者Email
	 * @param country
	 *            景点所在国家，全部基于SityType的编号来 2011.9.8
	 * @param province
	 *            景点所在省份
	 * @param city
	 *            景点所在城市
	 * @param siteId
	 *            景点地点信息ID
	 * @param detailAddress
	 *            景点所在详细地址
	 * @param position
	 *            景点的坐标
	 * @param content
	 */
	public long insertSpot(String name, SpotType type,
			Long creatorId, String creatorNickName, String creatorPortrait,
			String creatorEmail, String country, String province, String city,
			String siteId, String detailAddress,  Double lat, Double lng,
			String content);

	/*
	 * 管理员
	 */

	/**
	 * 更新景点函数
	 * 
	 * @param spotId
	 *            景点ID
	 * @param name
	 *            景点名称
	 * @param type
	 *            类型 VIEWPOINT,RESTAURANT,OTHER 参见SpotType
	 * @param creatorId
	 *            创建者ID
	 * @param country
	 *            景点所在国家，全部基于SityType的编号来 2011.9.8
	 * @param province
	 *            景点所在省份
	 * @param city
	 *            景点所在城市
	 * @param siteId
	 *            景点地点信息ID
	 * @param detailAddress
	 *            景点所在详细地址
	 * @param position
	 *            景点的坐标
	 */
	public void updateSpot(Long spotId, String name,SpotType type,
			String country, String province, String city, String siteId,
			String detailAddress,Double lat, Double lng);

	/**
	 * 更新景点说明函数，由于景点的头像更新的比较平凡，所以单独提出
	 * 
	 * @param spotId
	 * @param portrait
	 */
	public void updateSpotPortrait(Long spotId, String portrait);
	
	/**
	 * 更新景点说明函数，由于景点的描述更新的比较平凡，所以单独提出
	 * 
	 * @param spotId
	 * @param content
	 */
	public void updateSpotIntroduction(Long spotId, String content);

	/**
	 * 更新景点特色标志，也可以说是印象
	 * 
	 * @param spotId
	 * @param characteristic
	 */

	public void updateSpotCharacteristic(Long spotId, String characteristic);

	/**
	 * 变更spot的管理员信息
	 * 
	 * @param spotId
	 * @param administratorId
	 * @param administratorNickName
	 * @param administratorEmail
	 * @param administratorPortrait
	 */
	public void updateSpotAdministrator(Long spotId, Long administratorId,
			String administratorNickName, String administratorEmail,
			String administratorPortrait);

	public void deleteSpot(Long spotId);

	public void recoverSpot(Long spotId);

}
